/**
 * 平台检测和设备信息工具
 */

// 获取设备信息
export function getDeviceInfo() {
  return uni.getDeviceInfo()
}

// 获取窗口信息
export function getWindowInfo() {
  return uni.getWindowInfo()
}

// 获取系统信息
export function getSystemInfo() {
  return uni.getSystemInfoSync()
}

// 平台类型枚举
export enum PlatformType {
  H5 = 'h5',
  H5_WECHAT = 'h5-wechat', // 微信浏览器
  APP = 'app',
  MP_WEIXIN = 'mp-weixin',
  MP_ALIPAY = 'mp-alipay',
  MP_BAIDU = 'mp-baidu',
  MP_TOUTIAO = 'mp-toutiao',
  MP_QQ = 'mp-qq',
  UNKNOWN = 'unknown',
}

// 终端类型枚举（与后端对应）
export enum TerminalType {
  UNKNOWN = 0,
  WECHAT_MINI_PROGRAM = 10,
  WECHAT_WAP = 11, // 微信公众号
  H5 = 20,
  APP = 31,
}

// 社交登录类型枚举
export enum SocialTypeEnum {
  WECHAT_MINI_PROGRAM = 30, // 微信小程序
  WECHAT_OPEN_PLATFORM = 31, // 微信开放平台
  WECHAT_ENTERPRISE = 32, // 微信企业号
  WECHAT_WORK = 33, // 微信企业微信
  WECHAT_MP = 34, // 微信公众号
  DINGTALK = 35, // 钉钉
}

/**
 * 判断是否为微信浏览器（完整版）
 */
export function isWechatBrowser(): boolean {
  // #ifdef H5
  if (typeof window === 'undefined' || typeof navigator === 'undefined') {
    return false
  }

  const ua = navigator.userAgent.toLowerCase()

  // 检查是否包含微信标识
  const isWechat = ua.includes('micromessenger')

  // 排除微信小程序webview
  const isNotMiniProgram = !ua.includes('miniprogram')

  return isWechat && isNotMiniProgram
  // #endif

  // #ifndef H5
  return false
  // #endif
}

/**
 * 判断是否为微信小程序环境
 */
export function isWechatMiniProgram(): boolean {
  // #ifdef MP-WEIXIN
  return true
  // #endif

  // #ifdef H5
  if (typeof window === 'undefined' || typeof navigator === 'undefined') {
    return false
  }

  const ua = navigator.userAgent.toLowerCase()
  return ua.includes('micromessenger') && ua.includes('miniprogram')
  // #endif

  // #ifndef H5 || MP-WEIXIN
  return false
  // #endif
}

/**
 * 判断是否为微信环境（包括浏览器和小程序）
 */
export function isWechatEnvironment(): boolean {
  return isWechatBrowser() || isWechatMiniProgram()
}

/**
 * 获取微信版本号
 */
export function getWechatVersion(): string {
  // #ifdef H5
  if (!isWechatBrowser()) {
    return ''
  }

  try {
    const ua = navigator.userAgent.toLowerCase()
    const match = ua.match(/micromessenger\/(\d+\.\d+\.\d+)/)
    return match ? match[1] : ''
  }
  catch (error) {
    console.error('获取微信版本失败:', error)
    return ''
  }
  // #endif

  // #ifndef H5
  return ''
  // #endif
}

/**
 * 判断是否支持微信JS-SDK
 */
export function isSupportWechatJSSDK(): boolean {
  // #ifdef H5
  if (!isWechatBrowser() || typeof window === 'undefined') {
    return false
  }

  // 优先检查保存的原始微信JS-SDK对象
  // @ts-expect-error _wxOriginal is set by WeChat JS-SDK loading
  if (window._wxOriginal && typeof window._wxOriginal.config === 'function') {
    return true
  }

  // 备用检查：检查wx对象是否为微信JS-SDK（而不是uni-app的wx）
  if ('wx' in window) {
    // @ts-expect-error wx is provided by WeChat JS-SDK
    return typeof wx.config === 'function'
  }

  return false
  // #endif

  // #ifndef H5
  return false
  // #endif
}

/**
 * 获取当前平台类型（完善版）
 */
export function getPlatformType(): PlatformType {
  // #ifdef H5
  if (isWechatBrowser()) {
    return PlatformType.H5_WECHAT
  }
  return PlatformType.H5
  // #endif

  // #ifdef APP-PLUS
  return PlatformType.APP
  // #endif

  // #ifdef MP-WEIXIN
  return PlatformType.MP_WEIXIN
  // #endif

  // #ifdef MP-ALIPAY
  return PlatformType.MP_ALIPAY
  // #endif

  // #ifdef MP-BAIDU
  return PlatformType.MP_BAIDU
  // #endif

  // #ifdef MP-TOUTIAO
  return PlatformType.MP_TOUTIAO
  // #endif

  // #ifdef MP-QQ
  return PlatformType.MP_QQ
  // #endif

  return PlatformType.UNKNOWN
}

/**
 * 获取终端类型（与后端对应）
 */
export function getTerminalType(): TerminalType {
  const platformType = getPlatformType()

  switch (platformType) {
    case PlatformType.APP:
      return TerminalType.APP
    case PlatformType.H5:
      return TerminalType.H5
    case PlatformType.H5_WECHAT:
      return TerminalType.WECHAT_WAP
    case PlatformType.MP_WEIXIN:
      return TerminalType.WECHAT_MINI_PROGRAM
    default:
      return TerminalType.UNKNOWN
  }
}

/**
 * 获取平台名称
 */
export function getPlatformName(): string {
  const platformType = getPlatformType()

  const platformNames = {
    [PlatformType.H5]: 'H5',
    [PlatformType.H5_WECHAT]: '微信浏览器',
    [PlatformType.APP]: '原生应用',
    [PlatformType.MP_WEIXIN]: '微信小程序',
    [PlatformType.MP_ALIPAY]: '支付宝小程序',
    [PlatformType.MP_BAIDU]: '百度小程序',
    [PlatformType.MP_TOUTIAO]: '抖音小程序',
    [PlatformType.MP_QQ]: 'QQ小程序',
    [PlatformType.UNKNOWN]: '未知平台',
  }

  return platformNames[platformType] || '未知平台'
}

/**
 * 获取操作系统类型
 */
export function getOSType(): string {
  return getDeviceInfo().platform?.toLowerCase() || 'unknown'
}

/**
 * 判断是否为iOS
 */
export function isIOS(): boolean {
  return getOSType() === 'ios'
}

/**
 * 判断是否为Android
 */
export function isAndroid(): boolean {
  return getOSType() === 'android'
}

/**
 * 获取浏览器信息（仅H5）
 */
export function getBrowserInfo() {
  // #ifdef H5
  if (typeof window === 'undefined' || typeof navigator === 'undefined') {
    return {
      name: 'Unknown',
      version: '',
      userAgent: '',
    }
  }

  const ua = navigator.userAgent
  const uaLower = ua.toLowerCase()

  let browserName = 'Unknown'
  let browserVersion = ''

  // 检测浏览器类型
  if (uaLower.includes('micromessenger')) {
    browserName = 'WeChat'
    const match = uaLower.match(/micromessenger\/(\d+\.\d+\.\d+)/)
    browserVersion = match ? match[1] : ''
  }
  else if (uaLower.includes('chrome')) {
    browserName = 'Chrome'
    const match = uaLower.match(/chrome\/(\d+\.\d+\.\d+)/)
    browserVersion = match ? match[1] : ''
  }
  else if (uaLower.includes('safari')) {
    browserName = 'Safari'
    const match = uaLower.match(/version\/(\d+\.\d+\.\d+)/)
    browserVersion = match ? match[1] : ''
  }
  else if (uaLower.includes('firefox')) {
    browserName = 'Firefox'
    const match = uaLower.match(/firefox\/(\d+\.\d+\.\d+)/)
    browserVersion = match ? match[1] : ''
  }

  return {
    name: browserName,
    version: browserVersion,
    userAgent: ua,
    isWechat: isWechatBrowser(),
    isWechatMiniProgram: isWechatMiniProgram(),
  }
  // #endif

  // #ifndef H5
  return {
    name: 'Unknown',
    version: '',
    userAgent: '',
    isWechat: false,
    isWechatMiniProgram: false,
  }
  // #endif
}

/**
 * 获取小程序胶囊信息
 */
export function getCapsuleInfo() {
  // #ifdef MP
  let capsule = uni.getMenuButtonBoundingClientRect()
  if (!capsule) {
    capsule = {
      bottom: 56,
      height: 32,
      left: 278,
      right: 365,
      top: 24,
      width: 87,
    }
  }
  return capsule
  // #endif

  // #ifndef MP
  return {
    bottom: 56,
    height: 32,
    left: 278,
    right: 365,
    top: 24,
    width: 87,
  }
  // #endif
}

/**
 * 获取状态栏高度
 */
export function getStatusBarHeight(): number {
  return getWindowInfo().statusBarHeight || 0
}

/**
 * 获取导航栏高度
 */
export function getNavBarHeight(): number {
  return getStatusBarHeight() + 44
}

/**
 * 获取安全区域
 */
export function getSafeAreaInsets() {
  return getWindowInfo().safeAreaInsets || { top: 0, bottom: 0, left: 0, right: 0 }
}

/**
 * 获取屏幕尺寸信息
 */
export function getScreenInfo() {
  const windowInfo = getWindowInfo()
  return {
    screenWidth: windowInfo.screenWidth,
    screenHeight: windowInfo.screenHeight,
    windowWidth: windowInfo.windowWidth,
    windowHeight: windowInfo.windowHeight,
    statusBarHeight: windowInfo.statusBarHeight,
    safeAreaInsets: windowInfo.safeAreaInsets,
    pixelRatio: windowInfo.pixelRatio || 1,
  }
}

/**
 * 检查网络连接
 */
export async function checkNetwork(): Promise<boolean> {
  try {
    const networkStatus = await uni.getNetworkType()
    return networkStatus.networkType !== 'none'
  }
  catch (error) {
    console.error('检查网络状态失败:', error)
    return false
  }
}

// 微信小程序配置类（保持原有功能）
class WechatMiniProgram {
  socialType = SocialTypeEnum.WECHAT_MP
  private openid: string = ''

  // 检查是否在微信小程序环境
  isWechatMiniProgram(): boolean {
    return isWechatMiniProgram()
  }

  // 静默登录 - 获取微信授权码
  async silentLogin(): Promise<{ success: boolean, code?: string, error?: string }> {
    return new Promise((resolve) => {
      uni.login({
        provider: 'weixin',
        success: (res) => {
          if (res.code) {
            console.log('✅ 微信授权码获取成功:', res.code)
            resolve({ success: true, code: res.code })
          }
          else {
            console.error('❌ 微信授权码获取失败:', res.errMsg)
            resolve({ success: false, error: res.errMsg })
          }
        },
        fail: (err) => {
          console.error('❌ 微信授权失败:', err)
          resolve({ success: false, error: err.errMsg })
        },
      })
    })
  }

  // 手机号登录 - 获取手机号和登录授权码
  async phoneLogin(e: any): Promise<{
    success: boolean
    phoneCode?: string
    loginCode?: string
    error?: string
  }> {
    try {
      // 检查是否获取到手机号授权码
      if (!e.detail.code) {
        throw new Error('用户拒绝授权手机号')
      }

      const phoneCode = e.detail.code

      // 获取登录授权码
      const loginResult = await this.silentLogin()
      if (!loginResult.success || !loginResult.code) {
        throw new Error('获取登录授权码失败')
      }

      return {
        success: true,
        phoneCode,
        loginCode: loginResult.code,
      }
    }
    catch (error: any) {
      console.error('❌ 微信手机号登录失败:', error)
      return {
        success: false,
        error: error.message || '微信手机号登录失败',
      }
    }
  }

  // 设置 openid
  setOpenid(openid: string) {
    this.openid = openid
    uni.setStorageSync('wechat-openid', openid)
  }

  // 获取 openid
  getOpenid(): string {
    if (!this.openid) {
      this.openid = uni.getStorageSync('wechat-openid') || ''
    }
    return this.openid
  }
}

// 平台配置类
class PlatformConfig {
  private wechatMP: WechatMiniProgram

  constructor() {
    this.wechatMP = new WechatMiniProgram()
  }

  // 检查是否在微信小程序环境
  isWechatMiniProgram(): boolean {
    return this.wechatMP.isWechatMiniProgram()
  }

  // 获取微信小程序实例
  getWechatMiniProgram(): WechatMiniProgram {
    return this.wechatMP
  }

  // 获取当前平台信息
  getPlatformInfo() {
    return {
      type: getPlatformType(),
      name: getPlatformName(),
      terminal: getTerminalType(),
      isWechatMiniProgram: this.isWechatMiniProgram(),
      isWechatBrowser: isWechatBrowser(),
      isWechatEnvironment: isWechatEnvironment(),
      osType: getOSType(),
      isIOS: isIOS(),
      isAndroid: isAndroid(),
    }
  }
}

// 导出单例
const platformConfig = new PlatformConfig()
export default platformConfig
